/*
   Copyright (c) 2016 VMware, Inc. All Rights Reserved.
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

package auth

import (
	"net/http"
)

// Credential ...
//定义一个认证器接口,可以有多种实现,如标准的http basic认证、基于cookie的认证方式等
type Credential interface {
	// AddAuthorization adds authorization information to request
	AddAuthorization(req *http.Request)
}

// Implements interface Credential
//定义基本的用户名密码认证器并实现Credential接口
type basicAuthCredential struct {
	username string
	password string
}

// NewBasicAuthCredential ...
//创建一个新的密码认证器
func NewBasicAuthCredential(username, password string) Credential {
	return &basicAuthCredential{
		username: username,
		password: password,
	}
}

//实现Credential中的AddAuthorization方法
func (b *basicAuthCredential) AddAuthorization(req *http.Request) {
	//获取http标准请求,把当前的基本认证信息放到http请求头当中
	req.SetBasicAuth(b.username, b.password)
}

//定义基于cookie的认证器并实现Credential接口
type cookieCredential struct {
	cookie *http.Cookie
}

// NewCookieCredential initialize a cookie based crendential handler, the cookie in parameter will be added to request to registry
// if this crendential is attached to a registry client.
//创建新的的cookie的认证器
func NewCookieCredential(c *http.Cookie) Credential {
	return &cookieCredential{
		cookie: c,
	}
}

//实现Credential中的AddAuthorization方法
func (c *cookieCredential) AddAuthorization(req *http.Request) {
	req.AddCookie(c.cookie)
}
